#include <iostream>
#include <thread>
#include <unistd.h>
#include <vector>
using namespace std;

// 测试c++11中的线程库，使用c++标准库线程的时候也要链接linux的原生库pthread，不然会报错未定义的函数

void routine(int n)
{
    while (n--)
    {
        cout << "i am a new thread, " << n << endl;
        sleep(1);
    }
}

void obtainTickets(int *t)
{
    while ((*t) > 0)
    {
        cout << "rticket is  " << *t << endl;
        sleep(1);
        //git_id()可以获取线程id,返回值是thread::id，thread内部的一个类型，此函数是成员方法，需要通过对象调用，此处无法使用
        (*t)--;
    }
}

void* work(void* t)
{
    int* pt = (int*)t;
    sleep(2);
    while((*pt) > 0)
    {
        cout << "thread " << pthread_self() << ", ticket is " << *pt << endl;
        (*pt)--;
    }
    return pt;
}

int main()
{
    // //创建一个线程并等待
    // thread t(routine, 10); //创建一个线程，并执行routine，routine可以是任何函数
    // t.join(); //等待线程

    // // 创建一批线程模拟抢票-----c++11中的线程实现了互斥和同步
    // int tickets = 10;
    // int num = 5;              // 创建的线程数
    // vector<thread *> vthread; // 将创建的线程保持起来，方便后面回收
    // for (int i = 0; i < num; i++)
    // {
    //     thread *pt = new thread(obtainTickets, &tickets);
    //     vthread.push_back(pt);
    // }

    // // 等待线程
    // for (auto &pt : vthread)
    // {
    //     pt->join();
    // }

    //利用原生库来实现抢票会发生
    int tickets = 10000;
    vector<pthread_t> vpthread;
    for(int i = 0;i < 5; i++)
    {
        pthread_t tid;
        pthread_create(&tid, nullptr, work, &tickets);
        cout << "tid = " << tid << endl;
        vpthread.push_back(tid);
    }

    for(auto& tid : vpthread)
    {
        void* pret;
        pthread_join(tid, &pret);
        cout << "return value is " << (int*)pret << endl;
    }



    return 0;
}